package org.jsola.hr.service;

import org.jsola.admin.dto.DictItemUpdateDTO;
import org.jsola.admin.entity.DictItemDO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpSocRelatedDAO;
import org.jsola.hr.dto.EmpSocRelatedAddDTO;
import org.jsola.hr.dto.EmpSocRelatedUpdateDTO;
import org.jsola.hr.dto.excel.EmpImportSocRelatedDTO;
import org.jsola.hr.dto.excel.EmpInfoImportDTO;
import org.jsola.hr.entity.EmpInfoDO;
import org.jsola.hr.entity.EmpSocPlanDO;
import org.jsola.hr.entity.EmpSocRelatedDO;
import org.jsola.hr.entity.SocProgDO;
import org.jsola.hr.query.EmpSocRelatedQuery;
import org.jsola.hr.vo.EmpSocRelatedListVO;
import org.jsola.hr.vo.EmpSocRelatedVO;
import org.jsola.user.core.TokenUser;

import java.util.Date;
import java.util.List;


/**
 * 员工社保相关信息表
 *
 * @author zhr
 */
public interface IEmpSocRelatedService extends IService<IEmpSocRelatedDAO, EmpSocRelatedDO> {

    /**
     * 新增员工社保相关信息表
     *
     * @param empSocRelatedAddDTO 新增员工社保相关信息表DTO
     * @param tokenUser           当前用户
     * @return 员工社保相关信息表详情信息
     */
    EmpSocRelatedVO save(EmpSocRelatedAddDTO empSocRelatedAddDTO, TokenUser tokenUser);

    /**
     * 修改员工社保相关信息表
     *
     * @param empSocRelatedUpdateDTO 修改员工社保相关信息表DTO
     * @param tokenUser              当前用户
     * @return 更新数量
     */
    int update(EmpSocRelatedUpdateDTO empSocRelatedUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工社保相关信息表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser        当前用户
     * @param empSocRelatedIds 员工社保相关信息表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empSocRelatedIds);

    /**
     * 根据员工社保相关信息表id查找
     *
     * @param empSocRelatedId 员工社保相关信息表id
     * @param siteId          所属站点id
     * @return 员工社保相关信息表详情信息
     */
    EmpSocRelatedVO selectById(String empSocRelatedId, String siteId);

    /**
     * 查询员工社保相关信息表
     *
     * @param empSocRelatedQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工社保相关信息表列表信息
     */
    List<EmpSocRelatedListVO> select(EmpSocRelatedQuery empSocRelatedQuery, String siteId);

    /**
     * 查询员工社保相关信息表记录数
     *
     * @param empSocRelatedQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工社保相关信息表记录数
     */
    int selectCount(EmpSocRelatedQuery empSocRelatedQuery, String siteId);

    /**
     * 分页查询员工社保相关信息表
     *
     * @param empSocRelatedQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工社保相关信息表列表信息
     */
    Page<EmpSocRelatedListVO> selectPage(EmpSocRelatedQuery empSocRelatedQuery, String siteId);


    /**
     * 根据员工社保相关信息表id查找
     *
     * @param empSocRelatedId 员工社保相关信息表id
     * @param siteId          所属站点id
     * @return 员工社保相关信息表
     */
    EmpSocRelatedDO selectDOById(String empSocRelatedId, String siteId);

    /**
     * 查询员工社保相关信息表
     *
     * @param empSocRelatedQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工社保相关信息表列表
     */
    List<EmpSocRelatedDO> selectDO(EmpSocRelatedQuery empSocRelatedQuery, String siteId);

    /**
     * 根据员工id查询这些员工的社保相关信息
     *
     * @param empIdList 员工Id列表
     * @param siteId    站点
     * @return 员工社保相关信息
     */
    List<EmpSocRelatedDO> selectByEmpIdList(List<String> empIdList, String siteId);

    /**
     * 根据员工id查询这些员工的社保相关信息(只查了empId)
     *
     * @param empIdList 员工Id列表
     * @param siteId    站点
     * @return 员工社保相关信息
     */
    List<EmpSocRelatedDO> selectByEmpIdListSelectProperties(List<String> empIdList, String siteId);

    /**
     * 根据员工id查询员工的社保相关信息
     *
     * @param empId  员工Id列表
     * @param siteId 站点
     * @return 员工社保相关信息
     */
    EmpSocRelatedDO selectByEmpId(String empId, String siteId);

    /**
     * 根据员工id查询员工的社保相关信息(被删除的员工也可以被删除)
     *
     * @param empId  员工Id列表
     * @param siteId 站点
     * @return 员工社保相关信息
     */
    EmpSocRelatedDO selectByEmpIdIgnoreValid(String empId, String siteId);

    /**
     * 根据类型赋值计划减员时间和状态
     *
     * @param type             类型
     * @param empSocRelatedDO  员工社保相关信息
     * @param planIncreaseDate 计划增减员时间
     * @param schemeId         参保方案Id
     * @param tokenUser        当前用户
     */
    void updatePlanDateByIncreaseMsg(Integer type, EmpSocRelatedDO empSocRelatedDO,
                                     Date planIncreaseDate, String schemeId, TokenUser tokenUser);

    /**
     * 根据增员类型赋值对应增员时间
     *
     * @param type            增员类型
     * @param empSocRelatedDO 员工社保相关信息
     * @param increaseDat     增员时间
     */
    void setIncreaseDateByType(Integer type, EmpSocRelatedDO empSocRelatedDO, Date increaseDat);

    /**
     * 根据增员类型赋值对应计划增员时间
     *
     * @param type            增员类型
     * @param empSocRelatedDO 员工社保相关信息
     * @param increaseDat     增员时间
     */
    void setPlanIncreaseDateByType(Integer type, EmpSocRelatedDO empSocRelatedDO, Date increaseDat);

    /**
     * 根据类型把计划增员时间更新到增员时间上,并设置对应状态
     *
     * @param empSocRelatedDO 员工社保相关信息
     * @param type            类型(社保/医保/公积金)
     * @param plan            是否是待增
     * @param tokenUser       当前用户
     */
    void updateIncreaseDate(EmpSocRelatedDO empSocRelatedDO, Integer type, Boolean plan, TokenUser tokenUser);

    /**
     * 根据类型把计划减员时间更新到减员时间上,并设置对应状态
     *
     * @param empSocRelatedDO 员工社保相关信息
     * @param type            类型(社保/医保/公积金)
     * @param plan            是否是待增
     * @param tokenUser       当前用户
     */
    void updateDecreaseDate(EmpSocRelatedDO empSocRelatedDO, Integer type, Boolean plan, TokenUser tokenUser);

    /**
     * 根据类型把对应的员工社保状态改为停保
     *
     * @param empSocRelatedDO 员工社保状态
     * @param type            类型
     * @param tokenUser       当前用户
     */
    void updateStopStatus(EmpSocRelatedDO empSocRelatedDO, Integer type, TokenUser tokenUser);

    /**
     * 根据类型把对应的员工社保状态改为正常参保
     *
     * @param empSocRelatedDO 员工社保状态
     * @param type            类型
     * @param tokenUser       当前用户
     */
    void updateNormalStatus(EmpSocRelatedDO empSocRelatedDO, Integer type, TokenUser tokenUser);

    /**
     * 根据类型把对应的员工社保状态改为正常参保
     *
     * @param empSocRelatedDO 员工社保状态
     * @param type            类型
     * @param tokenUser       当前用户
     */
    void setNormalStatus(EmpSocRelatedDO empSocRelatedDO, Integer type, TokenUser tokenUser);

    /**
     * 根据类型赋值计划减员时间和状态
     *
     * @param empSocRelatedDO 员工社保相关信息
     * @param type            类型(社保/医保/公积金)
     * @param decreaseDate    当前类型的减员时间
     */
    void updatePlanDateByDecreaseMsg(EmpSocRelatedDO empSocRelatedDO, Integer type, Date decreaseDate);

    /**
     * 根据类型赋值减员时间
     *
     * @param empSocRelatedDO 员工社保相关信息
     * @param type            类型
     * @param decreaseDate    减员时间
     */
    void setStopDateByType(EmpSocRelatedDO empSocRelatedDO, Integer type, Date decreaseDate);

    /**
     * 根据类型赋值减员时间
     *
     * @param empSocRelatedDO 员工社保相关信息
     * @param type            类型
     * @param decreaseDate    减员时间
     */
    void setStopDateByType2(EmpSocRelatedDO empSocRelatedDO, Integer type, Date decreaseDate);

    /**
     * 初始化公司下所有员工的社保相关信息
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     */
    void initAllRelatedByCompany(String companyId, TokenUser tokenUser);

    /**
     * 初始化一个员工的社保相关信息
     *
     * @param empId     员工Id
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     */
    void initRelatedByEmpId(String empId, String companyId, TokenUser tokenUser);

    /**
     * 清空员工对应类型的的计划增员时间
     *
     * @param empSocRelatedDO 员工社保信息
     * @param tokenUser       当前用户
     * @param type            类型
     */
    void clearedPlanIncreaseDate(EmpSocRelatedDO empSocRelatedDO, Integer type, TokenUser tokenUser);

    /**
     * 清空员工对应类型的的计划减员时间
     *
     * @param empSocRelatedDO 员工社保信息
     * @param tokenUser       当前用户
     * @param type            类型
     */
    void clearedPlanDecreaseDate(EmpSocRelatedDO empSocRelatedDO, Integer type, TokenUser tokenUser);

    /**
     * 校验计划减员时间是否在增员时间之前(在就报错)
     *
     * @param empSocRelatedDO 员工社保相关信息
     * @param empSocPlanDO    增减员计划实体
     * @param empInfoDO       员工实体
     */
    void checkDecreaseDate(EmpSocRelatedDO empSocRelatedDO, EmpSocPlanDO empSocPlanDO, EmpInfoDO empInfoDO);

    /**
     * 校验计划增员时间是否在减员时间之前(在就报错)
     *
     * @param empSocRelatedDO 员工社保相关信息
     * @param empSocPlanDO    增减员计划实体
     * @param empInfoDO       员工实体
     */
    void checkIncreaseDate(EmpSocRelatedDO empSocRelatedDO, EmpSocPlanDO empSocPlanDO, EmpInfoDO empInfoDO);

    /**
     * 查询花名册详情社保相关信息
     *
     * @param empId     员工Id
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 社保相关信息
     */
    EmpImportSocRelatedDTO findEmpSocRelated(String empId, String companyId, TokenUser tokenUser);

    /**
     * 导入花名册员工时同步导入社保数据
     *
     * @param importSucList 花名册导入的员工信息
     * @param empInfoDOList 员工信息
     * @param companyId     公司Id
     * @param tokenUser     当前用户
     */
    void empImportSocDate(List<EmpInfoImportDTO> importSucList, List<EmpInfoDO> empInfoDOList, String companyId,
                          List<DictItemDO> itemList, TokenUser tokenUser);

    /**
     * 花名册详情修改社保相关信息
     *
     * @param updateDTO 更新信息
     * @param tokenUser 当前用户
     */
    void empUpdateSocDate(EmpImportSocRelatedDTO updateDTO, TokenUser tokenUser);

    /**
     * 增员时校验导入人员的社保项
     *
     * @param empList   员工Id列表
     * @param tokenUser 当前用户
     * @return 员工导入的增员信息
     */
    EmpSocRelatedListVO empSocRelatedImportData(List<String> empList, TokenUser tokenUser);

    /**
     * 删除员工社保信息
     *
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 删除数量
     */
    Integer deleteByEmpId(String empId, TokenUser tokenUser);

    /**
     * 校验员工是否可以被删除 true 可以 false 不可以
     *
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 是否可以被删除
     */
    Boolean checkEmpCanBeDeleted(String empId, TokenUser tokenUser);

    /**
     * 异步更新
     *
     * @param updateList 更新列表
     */
    void asyncUpdateRelated(List<EmpSocRelatedDO> updateList);

    /**
     * 根据方案更新三个账号
     *
     * @param type          类型
     * @param empSocRelated 社保信息
     * @param socScheme     方案
     */
    void setAccountByScheme(Integer type, EmpSocRelatedDO empSocRelated, SocProgDO socScheme);

    /**
     * 更新dict
     */
    void updateDict(DictItemDO dictItem, DictItemUpdateDTO update, TokenUser tokenUser);

    /**
     * 查询dict
     *
     * @param dictItem  查询结果
     * @param tokenUser 当前用户
     */
    Integer selectDict(DictItemDO dictItem, TokenUser tokenUser);
}


